<!DOCTYPE html>
<html>
    <head>
        <title>yield</title>
        <style></style>
    </head>
    <body>
        <script>
            // 1、Generator 函数形如
            function* fn(x, y) {
                yield x + (yield y + 10);
                yield 3 + (yield);
                return 1;
            }
            // 不会自动执行，而是返回一个遍历器对象
            // 通过 .next() 执行，可以带参数
            const iteratorFn = fn(1, 2);
            console.log(iteratorFn.next()); // { value: 12, done: false }
            console.log(iteratorFn.next(2)); // { value: 3, done: false } // x + 2
            console.log(iteratorFn.next()); // { value: undefined, done: false }
            console.log(iteratorFn.next(6)); // { value: 9, done: false } // 3 + 6
            console.log(iteratorFn.next()); // { value: 1, done: true }

            // 如果不使用yield，就成了单纯的暂缓执行函数
            console.log("开始执行！ now:", new Date().toLocaleString());
            function* sleep() {
                console.log(
                    "执行完毕！当前时间为：",
                    new Date().toLocaleString()
                );
            }
            var generator0 = sleep();
            setTimeout(function () {
                generator0.next();
            }, 2000);

            // 2、yield*
            function* demo1() {
                yield 1;
                yield* demo2();
                yield 4;
            }
            function* demo2() {
                yield 2;
                yield 3;
            }
            for(let n of demo1()) {
              console.log("n is:", n)
            }
        </script>
    </body>
</html>
